//
// Created by yorkc on 2023/12/4.
//

#ifndef BASE_WSQLITE_H
#define BASE_WSQLITE_H

#include <vector>
#include <map>
#include <iostream>
#include "sqlite3.h"

#pragma comment(lib, "sqlite3.lib")

using namespace std;


class WSqlite {

public:
    WSqlite();

    ~WSqlite();

    /**
     * 创建数据库文件
     * @param path
     * @return
     */
    int CreateDbFile(const string &path);

    /**
     * 创建数据库表
     * @param table_name 表名称
     * @param feild_def 属性定义
     * @return
     */
    int CreateTable(const string &table_name, const string feild_def);


    int DropTable(const string &table_name);

    /**
     * 连接数据库
     * @param path
     * @return
     */
    int Opendb(const string &path);

    /**
     * 插入
     * @param sqlInsert
     * @return
     */
    int Insert(const string &sqlInsert);

    /**
     * 删除
     * @param sqlDelete
     * @return
     */
    int Delete(const string &sqlDelete);

    /**
     * 更新
     * @param sqlUpdate
     * @return
     */
    int Update(const string &sqlUpdate);

    /**
     * 查询
     * @param sqlQuery 查询sql
     * @param colnames 返回的列
     * @param datas 返回的结果，行列二维数组
     * @return 查询结果状态
     */
    int QueryData(const string &sqlQuery, vector<string> &colnames, vector<vector<string>> &datas);

    /**
     * 查询
     * @param sqlQuery
     * @param results
     * @return
     */
    int QueryDataToMap(const string &sqlQuery, vector<map<std::string, std::string>> &results);

    int QueryDataWithC();

    /**
     * 模板方法查询，返回实体类
     * @tparam entity 返回的实体类
     * @param sqlQuery sql
     * @return 返回结果
     */
    template<typename E> E QueryData2(const string &sqlQuery,E entity);

private:
    void Destory();

    sqlite3 *db = NULL;
};


#endif //BASE_WSQLITE_H
